// 变量

/* 变量的定义规则：

	构造变量名称（唯一标识符）的通用规则是：

    1.名称可包含字母、数字、下划线和美元符号
    2.名称必须以字母开头
    3.名称也可以 $ 和 _ 开头（但是在本教程中我们不会这么做）
    4.名称对大小写敏感（y 和 Y 是不同的变量）
    5.保留字（比如 JavaScript 的关键词）无法用作变量名称
	
	对于一个变量来说，最重要的就是知名知意
    
*/

// es5的语法
// 包含了声明和赋值
var a = 1;
console.log(a);
// 变量的声明
var b;
console.log(b); // undefined 未定义 
// 变量的赋值
b = 1;

// 多个变量一起赋值 中间使用逗号分割
var c = 1, d = 2;

var b = 2; // 报错？不会报错 值保持之前的赋值
console.log(b);


var e = 1 + 4 + "5" // 55
console.log(e);
var f = "5" + 1 + 4  // 514
console.log(f);

// 代码块 
{
	var g = 2;
}
console.log(g); // 2

// es6: 引入了let 和const 提供了块作用域（Block Scope）变量（和常量）



// 使用let声明变量
let a1 = 1;
console.log(a1);


/* 
es5中var的问题：

1.变量提升
2.作用域问题 var定义变量 全局可用会造成滥用，变量冲突
*/

console.log(a2); // 报错？不会报错 发生了变量的提升
var a2 = 1;

// 变量提升不可用
// console.log(a3); // 会报错 Uncaught ReferenceError: can't access lexical declaration 'a3' before initialization
// let a3 = 1;


// 具有块作用域
{
	let a4 = 1;
}
// console.log(a4); // 会报错 Uncaught ReferenceError: a4 is not defined


// 定义常量 注意：定义常量的引用没有办法修改 因为有对象的原因
const a5 = 1;
console.log(a5);

// 常量不可修改
// a5 = 2; // 会报错 Uncaught TypeError: invalid assignment to const 'a5'














